package com.jd.scaffold.dao.base;

import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.jd.scaffold.common.entity.BaseEntity;
import com.jd.scaffold.common.entity.BasePageDTO;
import com.jd.scaffold.common.entity.Pagination;


/**
 * 
 * 描述:数据操作通用类，其他数据操作类应均继承与此类
 * <p>创建人：jrzhangwei 创建日期：2014年7月10日 </p>
 * @version V1.0
 */
public interface BaseDao {
	
    public final static Logger log = LogManager.getLogger(BaseDao.class);

   /**
    * 
    * 描述:根据主键更新实体信息
    * <p>创建人：jrzhangwei , 2014年7月11日 上午10:16:08</p>
    * @param parameterObject 包含主键的实体信息
    * @return
    */
    public int update(BaseEntity parameterObject);
    
    /**
     * 
     * 描述:根据主键删除记录
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:16:42</p>
     * @param parameterObject 包含主键的实体信息
     * @return
     */
    public int delete(BaseEntity parameterObject);
    
    /**
     * 
     * 描述:插入实体信息
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:18:32</p>
     * @param parameterObject 需要插入的实体信息
     * @return
     */
    public Object insert(BaseEntity parameterObject);
    
    /**
     * 
     * 描述:根据主键查询记录信息
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:19:01</p>
     * @param parameterObject 包含主键的实体信息
     * @return
     */
	public BaseEntity get(BaseEntity parameterObject);
	
	/**
	 * 
	 * 描述:根据条件查询记录
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:19:37</p>
	 * @param parameterObject 包含查询条件的实体信息
	 * @return
	 */
    public List<? extends BaseEntity> getList(BaseEntity parameterObject);
    
    /**
     * 
     * 描述:自定义根据条件查询记录
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:20:05</p>
     * @param statementName 查询对应sql
     * @param parameterObject 包含查询条件的实体信息
     * @return
     */
	public List<? extends BaseEntity> getList(String statementName, Object parameterObject);
    
	 /**
     * 
     * 描述:自定义根据条件查询记录
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:20:05</p>
     * @param statementName 查询对应sql
     * @param parameterObject 包含查询条件的实体信息
     * @return
     */
	public List<? extends Object> getList(String statementName);
	/**
	 * 
	 * 描述:根据条件查询一页记录
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:19:37</p>
	 * @param baseParamDTO 包含查询条件的实体信息
	 * @return
	 */
	public List<? extends BaseEntity> getFirstPagenationList(BasePageDTO baseParamDTO);
	
	/**
	 * 
	 * 描述:根据条件查询一页记录
	 * <p>创建人：jrzhangwei , 2014年7月25日 下午12:41:00</p>
	 * @param statementName 分页查询对应sql
	 * @param baseParamDTO 分页查询条件实体信息（其他查询实体信息需继承于该类）
	 * @return
	 */
	public List<? extends BaseEntity> getFirstPagenationList(String statementName,BasePageDTO baseParamDTO);
	
	/**
	 * 
	 * 描述:自定义根据条件分页查询记录
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:21:16</p>
	 * @param statementName 分页查询对应sql
	 * @param baseParamDTO 分页查询条件实体信息（其他查询实体信息需继承于该类）
	 * @return
	 */
	public Pagination<? extends BaseEntity> getPagenationList(String statementName, BasePageDTO baseParamDTO);
    
	/**
	 * 
	 * 描述:根据条件分页查询记录
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:23:08</p>
	 * @param baseParamDTO 分页查询条件实体信息（其他查询实体信息需继承于该类）
	 * @return
	 */
	public Pagination<? extends BaseEntity> getPagenationList(BasePageDTO baseParamDTO);
    
    /**
     * 
     * 描述:根据序号类型名称获取序号信息(该方法原则上不应该放在此处)
     * <p>创建人：jrzhangwei , 2014年7月11日 上午10:24:20</p>
     * @param sequencesName 序号类型名称
     * @return
     */
	public Long getNextSeqVal(String sequencesName);

	/**
	 * 
	 * 描述:批量插入实体信息
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:25:45</p>
	 * @param baseEntityList 需要插入的实体列表
	 * @return
	 */
	public int batchInsert(final List<? extends BaseEntity> baseEntityList);

	/**
	 * 
	 * 描述:批量更新实体信息
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:26:17</p>
	 * @param baseEntityList 需要更新的实体列表
	 */
	public 	void batchUpdate(final List<? extends BaseEntity> baseEntityList);
	
	/**
	 * 
	 * 描述:批量删除实体信息
	 * <p>创建人：jrzhangwei , 2014年7月11日 上午10:27:10</p>
	 * @param baseEntityList 需要删除的实体列表
	 */
	public 	void batchDelete(final List<? extends BaseEntity> baseEntityList);
	
	/**
	 * 
	 * 描述:批量处理实体信息（包括插入、更新、删除，根据实体对应的操作属性来判断）
	 * <p>创建人：jrzhangwei , 2014年7月25日 下午1:14:54</p>
	 * @param baseEntityList 需要批量处理的实体列表
	 */
	public void batchExecute(final List<? extends BaseEntity> baseEntityList);
}